---
title: 筛选
icon: Funnel
---

<MetaData
  lang="zh-CN"
  meta={{
    preset: [{
      client: '@univerjs/preset-sheets-filter',
      locale: '@univerjs/preset-sheets-filter/locales/zh-CN',
      style: '@univerjs/preset-sheets-filter/lib/index.css',
    }],
    plugins: [{
      client: '@univerjs/sheets-filter',
      facade: '@univerjs/sheets-filter/facade',
    }, {
      client: '@univerjs/sheets-filter-ui',
      locale: '@univerjs/sheets-filter-ui/locale/zh-CN',
      style: '@univerjs/sheets-filter-ui/lib/index.css',
    }],
    server: '否',
  }}
/>

筛选功能允许用户对电子表格中的数据进行筛选，以便快速查找和分析特定信息。它支持多种筛选条件和操作，帮助用户更高效地处理数据。

## 预设模式

### 安装

```package-install
npm install @univerjs/preset-sheets-filter
```

### 使用

```typescript
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
import UniverPresetSheetsCoreZhCN from '@univerjs/preset-sheets-core/locales/zh-CN'
import { UniverSheetsFilterPreset } from '@univerjs/preset-sheets-filter' // [!code ++]
import UniverPresetSheetsFilterZhCN from '@univerjs/preset-sheets-filter/locales/zh-CN' // [!code ++]
import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'

import '@univerjs/preset-sheets-core/lib/index.css'
import '@univerjs/preset-sheets-filter/lib/index.css' // [!code ++]

const { univerAPI } = createUniver({
  locale: LocaleType.ZH_CN,
  locales: {
    [LocaleType.ZH_CN]: mergeLocales(
      UniverPresetSheetsCoreZhCN,
      UniverPresetSheetsFilterZhCN, // [!code ++]
    ),
  },
  presets: [
    UniverSheetsCorePreset(),
    UniverSheetsFilterPreset(), // [!code ++]
  ],
})
```

### 预设与配置

```typescript
interface IUniverSheetsFilterPresetConfig {
  /**
   * 是否在筛选面板中显示筛选器同步开关。
   * 这个配置可以在协作场景中使用，允许用户选择是否启用筛选器同步。
   * @default false
   */
  enableSyncSwitch?: boolean
}
```

## 插件模式

### 安装

```package-install
npm install @univerjs/sheets-filter @univerjs/sheets-filter-ui
```

### 使用

```typescript
import { LocaleType, mergeLocales, Univer } from '@univerjs/core'
import { UniverSheetsFilterPlugin } from '@univerjs/sheets-filter' // [!code ++]
import { UniverSheetsFilterUIPlugin } from '@univerjs/sheets-filter-ui' // [!code ++]
import SheetsFilterUIZhCN from '@univerjs/sheets-filter-ui/locale/zh-CN' // [!code ++]

import '@univerjs/sheets-filter-ui/lib/index.css' // [!code ++]

import '@univerjs/sheets-filter/facade' // [!code ++]

const univer = new Univer({
  locale: LocaleType.ZH_CN,
  locales: {
    [LocaleType.ZH_CN]: mergeLocales(
      SheetsFilterUIZhCN, // [!code ++]
    ),
  },
})

univer.registerPlugin(UniverSheetsFilterPlugin) // [!code ++]
univer.registerPlugin(UniverSheetsFilterUIPlugin) // [!code ++]
```

### 插件与配置

```typescript
interface IUniverSheetsFilterConfig {
  /**
   * 是否在筛选面板中显示筛选器同步开关。
   * 这个配置可以在协作场景中使用，允许用户选择是否启用筛选器同步。
   * @default false
   */
  enableSyncSwitch?: boolean
}
```

## Facade API

完整 Facade API 类型定义，请查看 [FacadeAPI](https://reference.univer.ai/zh-CN)。

### 获取筛选器

返回一个 [`FFilter`](https://reference.univer.ai/zh-CN/classes/FFilter) 对象，若 sheet 没有筛选器，则返回 `null`。

- `FWorksheet` 对象上的 [`getFilter()`](https://reference.univer.ai/zh-CN/classes/FWorksheet#getfilter)
- `FRange` 对象上的 [`getFilter()`](https://reference.univer.ai/zh-CN/classes/FRange#getfilter)

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()

// 从 FWorksheet 获取筛选器
const fWorksheet = fWorkbook.getActiveSheet()
const fFilter = fWorksheet.getFilter()
fFilter?.getRange().getA1Notation()

// 从 FRange 获取筛选器
const fRange = fWorksheet.getRange('A1:D14')
const fFilter2 = fRange.getFilter()
fFilter2?.getRange().getA1Notation()
```

### 创建筛选器

创建一个 [`FFilter`](https://reference.univer.ai/zh-CN/classes/FFilter) 对象，若 sheet 已经有筛选器，则返回 `null`。

- `FRange` 对象上的 [`createFilter()`](https://reference.univer.ai/zh-CN/classes/FRange#createfilter)

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
const fRange = fWorksheet.getRange('A1:D14')
let fFilter = fRange.createFilter()

// 如果工作表已经有筛选器，则移除它并创建一个新的筛选器。
if (!fFilter) {
  fWorksheet.getFilter().remove()
  fFilter = fRange.createFilter()
}
fFilter.getRange().getA1Notation()
```

### 移除筛选器

[`FFilter.remove()`](https://reference.univer.ai/zh-CN/classes/FFilter#remove) 方法移除筛选器。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
fWorksheet.getFilter()?.remove()
```

### 获取列过滤条件

[`FFilter.getColumnFilterCriteria(column)`](https://reference.univer.ai/zh-CN/classes/FFilter#getcolumnfiltercriteria) 方法返回指定列的筛选条件。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 设置 C1:F10 范围的值
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// 创建 C1:F10 范围的筛选器
let fFilter = fRange.createFilter()

// 如果筛选器已经存在，则移除它并创建一个新的筛选器
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 设置 C 列的筛选条件，筛选出值不是 1、5、9 的行
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})

// 获取 C 和 D 列的筛选条件
fFilter.getColumnFilterCriteria(column) // { colId: 0, filters: { filters: ['1', '5', '9'] } }
fFilter.getColumnFilterCriteria(column + 1) // undefined
```

### 设置列筛选条件

[`FFilter.setColumnFilterCriteria(column, criteria)`](https://reference.univer.ai/zh-CN/classes/FFilter#setcolumnfiltercriteria) 方法设置指定列的筛选条件。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 设置 C1:F10 范围的值
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// 创建 C1:F10 范围的筛选器
let fFilter = fRange.createFilter()

// 如果筛选器已经存在，则移除它并创建一个新的筛选器
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 设置 C 列的筛选条件，筛选出值不是 1、5、9 的行
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})
```

### 移除列筛选条件

- [`FFilter.removeColumnFilterCriteria(column)`](https://reference.univer.ai/zh-CN/classes/FFilter#removecolumnfiltercriteria) 方法移除指定列的筛选条件。
- [`FFilter.removeFilterCriteria()`](https://reference.univer.ai/zh-CN/classes/FFilter#removefiltercriteria) 方法移除所有列的筛选条件。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 设置 C1:F10 范围的值
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// 创建 C1:F10 范围的筛选器
let fFilter = fRange.createFilter()

// 如果筛选器已经存在，则移除它并创建一个新的筛选器
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 设置 C 列的筛选条件，筛选出值不是 1、5、9 的行
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})

// 3 秒后清除 C 列的筛选条件
setTimeout(() => {
  fFilter.removeColumnFilterCriteria(column)
  // 或者使用 fFilter.removeFilterCriteria() 移除所有列的筛选条件
}, 3000)
```

### 获取过滤掉的行

[`FFilter.getFilteredOutRows()`](https://reference.univer.ai/zh-CN/classes/FFilter#getfilteredoutrows) 方法返回一个数组，包含被筛选掉的行的索引。

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()

// 设置一些 C1:F10 范围的值
const fRange = fWorksheet.getRange('C1:F10')
fRange.setValues([
  [1, 2, 3, 4],
  [2, 3, 4, 5],
  [3, 4, 5, 6],
  [4, 5, 6, 7],
  [5, 6, 7, 8],
  [6, 7, 8, 9],
  [7, 8, 9, 10],
  [8, 9, 10, 11],
  [9, 10, 11, 12],
  [10, 11, 12, 13],
])

// 创建 C1:F10 范围的筛选器
let fFilter = fRange.createFilter()

// 如果筛选器已经存在，则移除它并创建一个新的筛选器
if (!fFilter) {
  fRange.getFilter().remove()
  fFilter = fRange.createFilter()
}

// 设置 C 列的筛选条件，筛选出值不是 1、5、9 的行
const column = fWorksheet.getRange('C:C').getColumn()
fFilter.setColumnFilterCriteria(column, {
  colId: 0,
  filters: {
    filters: ['1', '5', '9'],
  },
})

// 打印被筛选掉的行
fFilter.getFilteredOutRows() // [1, 2, 3, 5, 6, 7, 9]
```

### 事件监听

完整事件类型定义，请查看 [Events](https://reference.univer.ai/zh-CN/classes/FEventName)。

`SheetRangeFiltered` 事件在列过滤条件发生改变时触发。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetRangeFiltered, (params) => {
  const { workbook, worksheet, col, criteria } = params
})

// 移除事件监听器，使用 `disposable.dispose()`
```

`SheetBeforeRangeFilter` 事件在列过滤条件发生改变前触发。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetBeforeRangeFilter, (params) => {
  const { workbook, worksheet, col, criteria } = params

  // 取消筛选条件更改操作
  params.cancel = true
})

// 移除事件监听器，使用 `disposable.dispose()`
```

`SheetRangeFilterCleared` 事件在清除筛选条件时触发。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetRangeFilterCleared, (params) => {
  const { workbook, worksheet } = params
})

// 移除事件监听器，使用 `disposable.dispose()`
```

`SheetBeforeRangeFilterClear` 事件在清除筛选条件前触发。

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.SheetBeforeRangeFilterClear, (params) => {
  const { workbook, worksheet } = params

  // 取消清除筛选条件操作
  params.cancel = true
})

// 移除事件监听器，使用 `disposable.dispose()`
```
